#!/bin/bash

# 部署配置 - 请根据你的服务器信息修改这些变量
SERVER_HOST="222.222.25.198"           # 服务器IP地址
SERVER_PASSWORD="warom@123"             # SSH密码（留空则提示输入）  
SERVER_USER="root"            # SSH用户名
SERVER_PORT="22"                       # SSH端口，默认22
REMOTE_PATH="/mydata/jars/aibox-pro"         # 服务器上的部署目录
JAR_NAME="aibox-pro.jar"
SERVICE_NAME="aibox"             # 服务名称（用于systemctl）

# 颜色输出
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查并设置密码
setup_password() {
    if [ -z "$SERVER_PASSWORD" ]; then
        echo -n "请输入服务器密码: "
        read -s SERVER_PASSWORD
        echo
    fi
    
    # 检查是否安装了sshpass
    if ! command -v sshpass &> /dev/null; then
        log_error "需要安装 sshpass 工具来支持密码认证"
        log_info "macOS: brew install sshpass"
        log_info "Ubuntu: sudo apt-get install sshpass"
        exit 1
    fi
}

# 检查配置
check_config() {
    setup_password
}

# 编译项目
build_project() {
    log_info "开始编译项目..."
    mvn clean package -DskipTests
    if [ $? -ne 0 ]; then
        log_error "编译失败"
        exit 1
    fi
    
    if [ ! -f "target/$JAR_NAME" ]; then
        log_error "JAR文件不存在: target/$JAR_NAME"
        exit 1
    fi
    
    log_info "编译完成: target/$JAR_NAME"
}

# 上传JAR到服务器
upload_jar() {
    log_info "上传JAR到服务器..."
    
    # 创建远程目录
    sshpass -p "$SERVER_PASSWORD" ssh -o StrictHostKeyChecking=no -p $SERVER_PORT $SERVER_USER@$SERVER_HOST "mkdir -p $REMOTE_PATH"
    
    # 上传JAR文件
    sshpass -p "$SERVER_PASSWORD" scp -o StrictHostKeyChecking=no -P $SERVER_PORT target/$JAR_NAME $SERVER_USER@$SERVER_HOST:$REMOTE_PATH/
    local upload_result=$?
    
    if [ $upload_result -ne 0 ]; then
        log_error "上传失败，错误代码: $upload_result"
        log_warn "可能的原因："
        log_warn "1. SSH连接失败（检查主机名、端口、用户名、密码）"
        log_warn "2. 远程目录权限不足"
        log_warn "3. 磁盘空间不足"
        log_warn "手动测试: sshpass -p \"密码\" ssh -p $SERVER_PORT $SERVER_USER@$SERVER_HOST"
        exit 1
    fi
    
    # 验证文件是否上传成功
    sshpass -p "$SERVER_PASSWORD" ssh -o StrictHostKeyChecking=no -p $SERVER_PORT $SERVER_USER@$SERVER_HOST "ls -la $REMOTE_PATH/$JAR_NAME"
    if [ $? -eq 0 ]; then
        log_info "上传完成并验证成功"
    else
        log_error "上传后文件验证失败"
        exit 1
    fi
}

# 重启服务
restart_service() {
    log_info "重启服务..."
    
    # 远程执行命令
    sshpass -p "$SERVER_PASSWORD" ssh -p $SERVER_PORT $SERVER_USER@$SERVER_HOST << EOF
        cd $REMOTE_PATH
        
        # 停止现有服务
        if pgrep -f "$JAR_NAME" > /dev/null; then
            echo "停止现有服务..."
            pkill -15 -f "$JAR_NAME"  # 发送SIGTERM信号
            sleep 5
            
            # 如果进程还在运行，强制杀死
            if pgrep -f "$JAR_NAME" > /dev/null; then
                echo "强制停止服务..."
                pkill -9 -f "$JAR_NAME"  # 发送SIGKILL信号
                sleep 2
            fi
        fi
        
        # 检查端口是否被占用
        if netstat -tln | grep -q ":28888 "; then
            echo "端口28888仍被占用，等待释放..."
            sleep 3
        fi
        
        # 启动新服务
        echo "启动新服务..."
        nohup java -jar $JAR_NAME > app.log 2>&1 &
        
        # 等待服务启动
        sleep 5
        
        # 检查服务状态
        if pgrep -f "$JAR_NAME" > /dev/null; then
            echo "服务启动成功"
            echo "进程ID: \$(pgrep -f "$JAR_NAME")"
        else
            echo "服务启动失败，请检查日志"
            tail -n 20 app.log
            exit 1
        fi
EOF
    
    if [ $? -eq 0 ]; then
        log_info "服务重启完成"
    else
        log_error "服务重启失败"
        exit 1
    fi
}

# 使用systemctl管理的版本（如果服务器配置了systemd服务）
restart_systemd_service() {
    log_info "使用systemctl重启服务..."
    
    sshpass -p "$SERVER_PASSWORD" ssh -p $SERVER_PORT $SERVER_USER@$SERVER_HOST << EOF
        # 停止服务
        sudo systemctl stop $SERVICE_NAME
        
        # 更新JAR文件权限
        sudo chmod +x $REMOTE_PATH/$JAR_NAME
        
        # 启动服务
        sudo systemctl start $SERVICE_NAME
        
        # 检查服务状态
        sudo systemctl status $SERVICE_NAME --no-pager
EOF
    
    if [ $? -eq 0 ]; then
        log_info "systemd服务重启完成"
    else
        log_error "systemd服务重启失败"
        exit 1
    fi
}

# 显示帮助信息
show_help() {
    echo "用法: ./deploy.sh [选项]"
    echo ""
    echo "选项:"
    echo "  -h, --help       显示帮助信息"
    echo "  -s, --systemd    使用systemctl管理服务（需要sudo权限）"
    echo "  -b, --build-only 仅编译，不上传"
    echo "  -u, --upload-only 仅上传，不编译不重启"
    echo ""
    echo "示例:"
    echo "  ./deploy.sh                # 完整部署（编译+上传+重启）"
    echo "  ./deploy.sh --systemd      # 使用systemd服务管理"
    echo "  ./deploy.sh --build-only   # 仅编译"
    echo "  ./deploy.sh --upload-only  # 仅上传"
}

# 主函数
main() {
    local build_only=false
    local upload_only=false
    local use_systemd=false
    
    # 解析命令行参数
    while [[ $# -gt 0 ]]; do
        case $1 in
            -h|--help)
                show_help
                exit 0
                ;;
            -s|--systemd)
                use_systemd=true
                shift
                ;;
            -b|--build-only)
                build_only=true
                shift
                ;;
            -u|--upload-only)
                upload_only=true
                shift
                ;;
            *)
                log_error "未知选项: $1"
                show_help
                exit 1
                ;;
        esac
    done
    
    check_config
    
    if [ "$upload_only" = false ]; then
        build_project
    fi
    
    if [ "$build_only" = false ]; then
        upload_jar
        
        if [ "$use_systemd" = true ]; then
            restart_systemd_service
        else
            restart_service
        fi
        
        log_info "部署完成！"
        log_info "应用地址: http://$SERVER_HOST:28888"
        log_info "API文档: http://$SERVER_HOST:28888/swagger-ui/index.html"
    fi
}

main "$@"